<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Teable 代码和文档说明</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            line-height: 1.6;
            margin: 20px;
            background-color: #f4f4f4;
            color: #333;
        }
        .container {
            max-width: 900px;
            margin: auto;
            background: #fff;
            padding: 30px;
            border-radius: 8px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }
        h1, h2, h3, h4 {
            color: #0056b3;
        }
        h1 {
            text-align: center;
            margin-bottom: 30px;
        }
        section {
            margin-bottom: 20px;
            padding-bottom: 20px;
            border-bottom: 1px solid #eee;
        }
        section:last-child {
            border-bottom: none;
        }
        ul {
            list-style-type: disc;
            margin-left: 20px;
        }
        ol {
            list-style-type: decimal;
            margin-left: 20px;
        }
        pre {
            background-color: #eee;
            padding: 10px;
            border-radius: 5px;
            overflow-x: auto;
        }
        code {
            font-family: "Courier New", Courier, monospace;
            background-color: #e9e9e9;
            padding: 2px 4px;
            border-radius: 3px;
        }
        .model-section {
            margin-bottom: 15px;
            border: 1px solid #ddd;
            padding: 10px;
            border-radius: 5px;
            background-color: #f9f9f9;
        }
        .model-section h4 {
            margin-top: 0;
        }
        .model-field {
            margin-left: 15px;
            margin-bottom: 5px;
        }
        .relationship {
            font-style: italic;
            color: #555;
            margin-left: 15px;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Teable 代码和文档说明</h1>

        <section id="code-comments">
            <h2>1. 代码注释说明</h2>
            <p>良好的代码注释对于提高代码可读性、可维护性和协作效率至关重要。以下是 Teable 项目中代码注释的通用准则和建议：</p>
            <h3>1.1. 通用准则</h3>
            <ul>
                <li><strong>清晰简洁：</strong> 注释应清晰、准确地解释代码的目的、功能和任何不明显的实现细节。避免冗余或显而易见的注释。</li>
                <li><strong>及时更新：</strong> 随着代码的修改，注释也应及时更新，以确保其与代码保持同步。过时的注释比没有注释更具误导性。</li>
                <li><strong>目的明确：</strong> 注释应解释"为什么"这样做，而不是"如何"这样做。代码本身应该足够清晰地说明"如何"实现。</li>
                <li><strong>英文注释：</strong> 鉴于项目可能涉及国际协作，建议使用英文进行注释。</li>
            </ul>
            <h3>1.2. 何时注释</h3>
            <ul>
                <li><strong>复杂逻辑：</strong> 对于复杂的算法、业务逻辑或难以理解的代码块，提供详细的解释。</li>
                <li><strong>不明显的代码：</strong> 当代码的行为不直观或有特殊考虑时，解释其背后的原因。</li>
                <li><strong>公共 API：：</strong> 对于函数、类、接口和类型定义，使用 JSDoc 风格注释，说明其目的、参数、返回值和可能抛出的错误。</li>
                <li><strong>重要常量/变量：</strong> 解释重要常量或变量的含义和用途。</li>
            </ul>
            <h3>1.3. 示例（JSDoc 风格）</h3>
            <pre><code>/**
 * @description 获取用户列表
 * @param {string} roleName - 角色名称
 * @returns {Promise&lt;User[]&gt;} 用户数组
 */
async function getUsers(roleName: string): Promise&lt;User[]&gt; {
    // ... implementation
}

/**
 * @classdesc 用于管理空间（Space）的模块。
 */
@Module({
    // ...
})
export class SpaceModule {}
</code></pre>
        </section>

        <section id="usage-instructions">
            <h2>2. 使用说明</h2>
            <p>本节提供了 Teable 项目的部署和开发指南。</p>
            <h3>2.1. 快速指南</h3>
            <p>如需快速体验，请访问 <a href="https://app.teable.io/public/template" target="_blank">Teable 模板中心</a>。</p>
            <h3>2.2. 部署</h3>
            <h4>2.2.1. 使用 Docker 部署</h4>
            <p>在本地使用 Docker 部署 Teable，请执行以下步骤：</p>
            <pre><code>cd dockers/examples/standalone/
docker-compose up -d
</code></pre>
            <p>更多详情，请参阅 <a href="https://help.teable.io/en/deploy/docker" target="_blank">安装 Teable</a>。</p>
            <h4>2.2.2. 一键部署</h4>
            <p>Teable 支持以下平台的一键部署：</p>
            <ul>
                <li>Railway</li>
                <li>Sealos</li>
                <li>Zeabur</li>
                <li>RepoCloud</li>
                <li>Elestio</li>
                <li>AlibabaCloud ComputeNest</li>
            </ul>
            <h3>2.3. 开发</h3>
            <h4>2.3.1. 初始化</h4>
            <pre><code># 启用包管理器助手
corepack enable

# 安装项目依赖
pnpm install
</code></pre>
            <h4>2.3.2. 选择数据库</h4>
            <p>Teable 目前支持 <code>sqlite</code>（仅限开发）和 <code>postgres</code>。您可以通过运行以下命令进行切换：</p>
            <pre><code>make switch-db-mode
</code></pre>
            <h4>2.3.3. 自定义环境变量（可选）</h4>
            <pre><code>cd apps/nextjs-app
cp .env.development .env.development.local
</code></pre>
            <h4>2.3.4. 运行开发服务器</h4>
            <p>您只需启动后端，它将自动启动 Next.js 前端服务器，文件更改将自动重新加载。</p>
            <pre><code>cd apps/nestjs-backend
pnpm dev
</code></pre>
            <p>默认情况下，插件开发服务器未启动。要预览和开发插件，请运行：</p>
            <pre><code># 构建 packages
pnpm build:packages

# 启动插件开发服务器
cd plugins
pnpm dev
</code></pre>
            <p>这将在端口 3002 上启动插件开发服务器。</p>
        </section>

        <section id="module-design">
            <h2>3. 模块设计</h2>
            <p>Teable 项目采用 Monorepo 结构，将不同的功能模块组织在独立的目录中，以提高可维护性和可扩展性。</p>
            <h3>3.1. 项目结构概述</h3>
            <ul>
                <li><code>apps/</code>：包含主要应用程序代码，如前端和后端。
                    <ul>
                        <li><code>nextjs-app</code>：前端应用，基于 Next.js。</li>
                        <li><code>nestjs-backend</code>：后端应用，基于 NestJS。</li>
                    </ul>
                </li>
                <li><code>packages/</code>：包含可重用的库和共享代码。
                    <ul>
                        <li><code>common-i18n</code>：国际化相关的共享代码。</li>
                        <li><code>core</code>：核心共享代码和通用接口。</li>
                        <li><code>sdk</code>：用于扩展的 SDK。</li>
                        <li><code>db-main-prisma</code>：数据库模式定义、迁移和 Prisma 客户端。</li>
                        <li><code>eslint-config-bases</code>：共享 ESLint 配置。</li>
                        <li><code>ui-lib</code>：可重用的 UI 组件库。</li>
                    </ul>
                </li>
                <li><code>plugins/</code>：用于自定义功能的插件。</li>
            </ul>
            <h3>3.2. 后端 (`nestjs-backend`) 模块</h3>
            <p>后端应用 (`nestjs-backend`) 采用模块化设计，每个主要功能都封装在独立的 NestJS 模块中。这使得代码结构清晰，易于管理和扩展。</p>
            <h4>3.2.1. 核心模块</h4>
            <ul>
                <li><code>app.module.ts</code>：根模块，负责聚合和注册所有其他模块。</li>
                <li><code>GlobalModule</code>：提供全局可用的服务或配置。</li>
                <li><code>LoggerModule</code>：日志记录功能。</li>
                <li><code>WsModule</code>：WebSocket 功能。</li>
            </ul>
            <h4>3.2.2. 特性模块</h4>
            <p>以下是一些主要的特性模块及其职责：</p>
            <ul>
                <li><code>AccessTokenModule</code>：管理 API 访问令牌。</li>
                <li><code>AggregationOpenApiModule</code>：聚合数据的 OpenAPI 接口。</li>
                <li><code>AiModule</code>：AI 相关功能。</li>
                <li><code>AttachmentsModule</code>：附件管理。</li>
                <li><code>AuthModule</code>：用户认证和授权。</li>
                <li><code>BaseModule</code>：管理 Base（数据库应用）的逻辑。</li>
                <li><code>ChatModule</code>：聊天功能。</li>
                <li><code>CollaboratorModule</code>：协作成员权限管理。</li>
                <li><code>CommentOpenApiModule</code>：评论功能的 OpenAPI 接口。</li>
                <li><code>DashboardModule</code>：仪表盘管理。</li>
                <li><code>DbProviderModule</code> (由 `db-main-prisma` 暗示)：负责数据库连接和操作。</li>
                <li><code>ExportOpenApiModule</code>：数据导出 OpenAPI 接口。</li>
                <li><code>FieldOpenApiModule</code>：字段管理的 OpenAPI 接口。</li>
                <li><code>HealthModule</code>：健康检查接口。</li>
                <li><code>ImportOpenApiModule</code>：数据导入 OpenAPI 接口。</li>
                <li><code>IntegrityModule</code>：数据完整性检查。</li>
                <li><code>InvitationModule</code>：邀请功能。</li>
                <li><code>NextModule</code>：Next.js 相关集成。</li>
                <li><code>NotificationModule</code>：用户通知。</li>
                <li><code>OAuthModule</code>：OAuth 认证集成。</li>
                <li><code>OrganizationModule</code>：组织管理。</li>
                <li><code>PinModule</code>：资源置顶功能。</li>
                <li><code>PluginModule</code>：插件管理。</li>
                <li><code>PluginContextMenuModule</code>：插件上下文菜单管理。</li>
                <li><code>PluginPanelModule</code>：插件面板管理。</li>
                <li><code>SelectionModule</code>：选择功能。</li>
                <li><code>SettingModule</code>：系统设置。</li>
                <li><code>ShareModule</code>：分享功能。</li>
                <li><code>SpaceModule</code>：工作空间管理。</li>
                <li><code>TemplateOpenApiModule</code>：模板功能的 OpenAPI 接口。</li>
                <li><code>TrashModule</code>：垃圾箱功能。</li>
                <li><code>UndoRedoModule</code>：撤销/重做功能的 OpenAPI 接口。</li>
                <li><code>UserModule</code>：用户管理。</li>
            </ul>
        </section>

        <section id="data-structure">
            <h2>4. 数据结构和数据表情况及关系</h2>
            <p>Teable 的数据结构通过 Prisma ORM 定义在 <code>packages/db-main-prisma/prisma/template.prisma</code> 文件中。Prisma 模型直接映射到数据库表，并定义了字段、类型以及它们之间的关系。</p>
            <p>以下是主要的数据库模型（表）、其关键字段及其关系：</p>

            <div class="model-section">
                <h4>Space</h4>
                <p>代表一个独立的工作空间，用户可以在其中创建和管理多个基础应用（Base）。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>name</code>: String - 空间名称。</li>
                    <li class="model-field"><code>credit</code>: Int? - 积分（可选）。</li>
                    <li class="model-field"><code>deletedTime</code>: DateTime? - 删除时间。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                    <li class="model-field"><code>lastModifiedBy</code>: String? - 最后修改者 ID。</li>
                    <li class="model-field"><code>lastModifiedTime</code>: DateTime? - 最后修改时间。</li>
                    <li class="model-field"><code>isTemplate</code>: Boolean? - 是否为模板。</li>
                </ul>
                <p class="relationship"><strong>关系：</strong> 一个 Space 可以包含多个 Base (`baseGroup Base[]`)。</p>
            </div>

            <div class="model-section">
                <h4>PinResource</h4>
                <p>表示被置顶的资源。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>type</code>: String - 资源类型。</li>
                    <li class="model-field"><code>resourceId</code>: String - 资源 ID。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                    <li class="model-field"><code>order</code>: Float - 排序。</li>
                </ul>
                <p class="relationship"><strong>唯一索引：</strong> (createdBy, resourceId)。</p>
            </div>

            <div class="model-section">
                <h4>Base</h4>
                <p>代表一个基于表格的数据库应用，包含多个 TableMeta。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>spaceId</code>: String - 所属 Space 的 ID。</li>
                    <li class="model-field"><code>name</code>: String - Base 名称。</li>
                    <li class="model-field"><code>order</code>: Float - 排序。</li>
                    <li class="model-field"><code>icon</code>: String? - 图标。</li>
                    <li class="model-field"><code>schemaPass</code>: String? - 模式密码。</li>
                    <li class="model-field"><code>deletedTime</code>: DateTime? - 删除时间。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                    <li class="model-field"><code>lastModifiedBy</code>: String? - 最后修改者 ID。</li>
                    <li class="model-field"><code>lastModifiedTime</code>: DateTime? - 最后修改时间。</li>
                </ul>
                <p class="relationship"><strong>关系：</strong> 属于一个 Space (`space Space @relation(fields: [spaceId], references: [id])`)；包含多个 TableMeta (`tables TableMeta[]`)。</p>
            </div>

            <div class="model-section">
                <h4>TableMeta</h4>
                <p>表的元数据，定义了实际数据表的结构和属性。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>baseId</code>: String - 所属 Base 的 ID。</li>
                    <li class="model-field"><code>name</code>: String - 表名称。</li>
                    <li class="model-field"><code>description</code>: String? - 表描述。</li>
                    <li class="model-field"><code>icon</code>: String? - 图标。</li>
                    <li class="model-field"><code>dbTableName</code>: String - 对应的数据库实际表名。</li>
                    <li class="model-field"><code>version</code>: Int - 版本。</li>
                    <li class="model-field"><code>order</code>: Float - 排序。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>lastModifiedTime</code>: DateTime? - 最后修改时间。</li>
                    <li class="model-field"><code>deletedTime</code>: DateTime? - 删除时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                    <li class="model-field"><code>lastModifiedBy</code>: String? - 最后修改者 ID。</li>
                </ul>
                <p class="relationship"><strong>关系：</strong> 属于一个 Base (`base Base @relation(fields: [baseId], references: [id])`)；包含多个 Field (`fields Field[]`)；包含多个 View (`views View[]`)；包含 PluginPanel (`pluginPanel PluginPanel[]`) 和 PluginContextMenu (`pluginContextMenu PluginContextMenu[]`)。</p>
            </div>

            <div class="model-section">
                <h4>Field</h4>
                <p>定义了 TableMeta 中每个字段的属性。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>name</code>: String - 字段名称。</li>
                    <li class="model-field"><code>description</code>: String? - 字段描述。</li>
                    <li class="model-field"><code>options</code>: String? - 字段选项（JSON 字符串）。</li>
                    <li class="model-field"><code>aiConfig</code>: String? - AI 配置。</li>
                    <li class="model-field"><code>type</code>: String - 字段类型。</li>
                    <li class="model-field"><code>cellValueType</code>: String - 单元格值类型。</li>
                    <li class="model-field"><code>isMultipleCellValue</code>: Boolean? - 是否允许多个单元格值。</li>
                    <li class="model-field"><code>dbFieldType</code>: String - 数据库字段类型。</li>
                    <li class="model-field"><code>dbFieldName</code>: String - 数据库字段名称。</li>
                    <li class="model-field"><code>notNull</code>: Boolean? - 是否非空。</li>
                    <li class="model-field"><code>unique</code>: Boolean? - 是否唯一。</li>
                    <li class="model-field"><code>isPrimary</code>: Boolean? - 是否为主键。</li>
                    <li class="model-field"><code>isComputed</code>: Boolean? - 是否为计算字段。</li>
                    <li class="model-field"><code>isLookup</code>: Boolean? - 是否为查找字段。</li>
                    <li class="model-field"><code>isPending</code>: Boolean? - 是否待处理。</li>
                    <li class="model-field"><code>hasError</code>: Boolean? - 是否有错误。</li>
                    <li class="model-field"><code>lookupLinkedFieldId</code>: String? - 查找字段链接的字段 ID。</li>
                    <li class="model-field"><code>lookupOptions</code>: String? - 查找选项。</li>
                    <li class="model-field"><code>tableId</code>: String - 所属 TableMeta 的 ID。</li>
                    <li class="model-field"><code>order</code>: Float - 排序。</li>
                    <li class="model-field"><code>version</code>: Int - 版本。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>lastModifiedTime</code>: DateTime? - 最后修改时间。</li>
                    <li class="model-field"><code>deletedTime</code>: DateTime? - 删除时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                    <li class="model-field"><code>lastModifiedBy</code>: String? - 最后修改者 ID。</li>
                </ul>
                <p class="relationship"><strong>关系：</strong> 属于一个 TableMeta (`table TableMeta @relation(fields: [tableId], references: [id])`)。</p>
            </div>

            <div class="model-section">
                <h4>View</h4>
                <p>定义了表格数据的不同视图（如网格、看板、日历等）。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>name</code>: String - 视图名称。</li>
                    <li class="model-field"><code>description</code>: String? - 视图描述。</li>
                    <li class="model-field"><code>tableId</code>: String - 所属 TableMeta 的 ID。</li>
                    <li class="model-field"><code>type</code>: String - 视图类型。</li>
                    <li class="model-field"><code>sort</code>: String? - 排序配置（JSON 字符串）。</li>
                    <li class="model-field"><code>filter</code>: String? - 过滤配置（JSON 字符串）。</li>
                    <li class="model-field"><code>group</code>: String? - 分组配置（JSON 字符串）。</li>
                    <li class="model-field"><code>options</code>: String? - 视图选项（JSON 字符串）。</li>
                    <li class="model-field"><code>order</code>: Float - 排序。</li>
                    <li class="model-field"><code>version</code>: Int - 版本。</li>
                    <li class="model-field"><code>columnMeta</code>: String - 列元数据。</li>
                    <li class="model-field"><code>isLocked</code>: Boolean? - 是否锁定。</li>
                    <li class="model-field"><code>enableShare</code>: Boolean? - 是否启用分享。</li>
                    <li class="model-field"><code>shareId</code>: String? - 分享 ID。</li>
                    <li class="model-field"><code>shareMeta</code>: String? - 分享元数据。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>lastModifiedTime</code>: DateTime? - 最后修改时间。</li>
                    <li class="model-field"><code>deletedTime</code>: DateTime? - 删除时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                    <li class="model-field"><code>lastModifiedBy</code>: String? - 最后修改者 ID。</li>
                </ul>
                <p class="relationship"><strong>关系：</strong> 属于一个 TableMeta (`table TableMeta @relation(fields: [tableId], references: [id])`)。</p>
            </div>

            <div class="model-section">
                <h4>Ops</h4>
                <p>操作日志，用于记录文档的协同编辑操作。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>collection</code>: String - 集合名称。</li>
                    <li class="model-field"><code>docId</code>: String - 文档 ID。</li>
                    <li class="model-field"><code>docType</code>: String - 文档类型。</li>
                    <li class="model-field"><code>version</code>: Int - 版本。</li>
                    <li class="model-field"><code>operation</code>: String - 操作内容。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                </ul>
                <p class="relationship"><strong>唯一索引：：</strong> (collection, docId, version)。</p>
            </div>

            <div class="model-section">
                <h4>Reference</h4>
                <p>字段之间的引用关系。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>fromFieldId</code>: String - 源字段 ID。</li>
                    <li class="model-field"><code>toFieldId</code>: String - 目标字段 ID。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                </ul>
                <p class="relationship"><strong>唯一索引：：</strong> (toFieldId, fromFieldId)。</p>
            </div>

            <div class="model-section">
                <h4>User</h4>
                <p>用户账户信息。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>name</code>: String - 用户名。</li>
                    <li class="model-field"><code>password</code>: String? - 密码哈希。</li>
                    <li class="model-field"><code>salt</code>: String? - 盐。</li>
                    <li class="model-field"><code>phone</code>: String? @unique - 手机号。</li>
                    <li class="model-field"><code>email</code>: String @unique - 邮箱。</li>
                    <li class="model-field"><code>avatar</code>: String? - 头像 URL。</li>
                    <li class="model-field"><code>isSystem</code>: Boolean? - 是否为系统用户。</li>
                    <li class="model-field"><code>isAdmin</code>: Boolean? - 是否为管理员。</li>
                    <li class="model-field"><code>isTrialUsed</code>: Boolean? - 试用是否已用。</li>
                    <li class="model-field"><code>notifyMeta</code>: String? - 通知元数据。</li>
                    <li class="model-field"><code>lastSignTime</code>: DateTime? - 最后登录时间。</li>
                    <li class="model-field"><code>deactivatedTime</code>: DateTime? - 停用时间。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>deletedTime</code>: DateTime? - 删除时间。</li>
                    <li class="model-field"><code>lastModifiedTime</code>: DateTime? - 最后修改时间。</li>
                    <li class="model-field"><code>refMeta</code>: String? - 引用元数据。</li>
                </ul>
                <p class="relationship"><strong>关系：：</strong> 包含多个 Account (`accounts Account[]`)。</p>
            </div>

            <div class="model-section">
                <h4>Account</h4>
                <p>用户关联的第三方账户信息（如 OAuth 登录）。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>userId</code>: String - 所属 User 的 ID。</li>
                    <li class="model-field"><code>type</code>: String - 账户类型。</li>
                    <li class="model-field"><code>provider</code>: String - 提供者（如 google, github）。</li>
                    <li class="model-field"><code>providerId</code>: String - 提供者处的唯一 ID。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                </ul>
                <p class="relationship"><strong>关系：：</strong> 属于一个 User (`user User @relation(fields: [userId], references: [id], onDelete: Cascade)`)。</p>
                <p class="relationship"><strong>唯一索引：：</strong> (provider, providerId)。</p>
            </div>

            <div class="model-section">
                <h4>Attachments</h4>
                <p>附件文件的元数据。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>token</code>: String @unique - 附件访问令牌。</li>
                    <li class="model-field"><code>hash</code>: String - 文件哈希。</li>
                    <li class="model-field"><code>size</code>: Int - 文件大小。</li>
                    <li class="model-field"><code>mimetype</code>: String - MIME 类型。</li>
                    <li class="model-field"><code>path</code>: String - 文件存储路径。</li>
                    <li class="model-field"><code>width</code>: Int? - 图片宽度。</li>
                    <li class="model-field"><code>height</code>: Int? - 图片高度。</li>
                    <li class="model-field"><code>deletedTime</code>: DateTime? - 删除时间。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                    <li class="model-field"><code>lastModifiedBy</code>: String? - 最后修改者 ID。</li>
                    <li class="model-field"><code>thumbnailPath</code>: String? - 缩略图路径。</li>
                </ul>
            </div>

            <div class="model-section">
                <h4>AttachmentsTable</h4>
                <p>附件与表记录的关联关系。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>attachmentId</code>: String - 附件 ID。</li>
                    <li class="model-field"><code>name</code>: String - 文件名称。</li>
                    <li class="model-field"><code>token</code>: String - 附件令牌。</li>
                    <li class="model-field"><code>tableId</code>: String - 所属 TableMeta 的 ID。</li>
                    <li class="model-field"><code>recordId</code>: String - 记录 ID。</li>
                    <li class="model-field"><code>fieldId</code>: String - 字段 ID。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                    <li class="model-field"><code>lastModifiedBy</code>: String? - 最后修改者 ID。</li>
                    <li class="model-field"><code>lastModifiedTime</code>: DateTime? - 最后修改时间。</li>
                </ul>
            </div>

            <div class="model-section">
                <h4>Collaborator</h4>
                <p>资源（如 Space, Base, Table）的协作成员及其角色权限。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>roleName</code>: String - 角色名称。</li>
                    <li class="model-field"><code>resourceType</code>: String - 资源类型（如 'space', 'base', 'table'）。</li>
                    <li class="model-field"><code>resourceId</code>: String - 资源 ID。</li>
                    <li class="model-field"><code>principalId</code>: String - 主体 ID（用户或团队）。</li>
                    <li class="model-field"><code>principalType</code>: String - 主体类型（如 'user', 'team'）。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>lastModifiedTime</code>: DateTime? - 最后修改时间。</li>
                    <li class="model-field"><code>lastModifiedBy</code>: String? - 最后修改者 ID。</li>
                </ul>
                <p class="relationship"><strong>唯一索引：：</strong> (resourceType, resourceId, principalId, principalType)。</p>
            </div>

            <div class="model-section">
                <h4>Invitation</h4>
                <p>邀请他人加入 Space 或 Base 的链接信息。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>baseId</code>: String? - 邀请所属 Base 的 ID。</li>
                    <li class="model-field"><code>spaceId</code>: String? - 邀请所属 Space 的 ID。</li>
                    <li class="model-field"><code>type</code>: String - 邀请类型。</li>
                    <li class="model-field"><code>role</code>: String - 被邀请者的角色。</li>
                    <li class="model-field"><code>invitationCode</code>: String - 邀请码。</li>
                    <li class="model-field"><code>expiredTime</code>: DateTime? - 过期时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>lastModifiedTime</code>: DateTime? - 最后修改时间。</li>
                    <li class="model-field"><code>lastModifiedBy</code>: String? - 最后修改者 ID。</li>
                    <li class="model-field"><code>deletedTime</code>: DateTime? - 删除时间。</li>
                </ul>
            </div>

            <div class="model-section">
                <h4>InvitationRecord</h4>
                <p>邀请记录，记录邀请的接受情况。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>invitationId</code>: String - 邀请 ID。</li>
                    <li class="model-field"><code>baseId</code>: String? - 邀请所属 Base 的 ID。</li>
                    <li class="model-field"><code>spaceId</code>: String? - 邀请所属 Space 的 ID。</li>
                    <li class="model-field"><code>type</code>: String - 记录类型。</li>
                    <li class="model-field"><code>inviter</code>: String - 邀请者 ID。</li>
                    <li class="model-field"><code>accepter</code>: String - 接受者 ID。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                </ul>
            </div>

            <div class="model-section">
                <h4>Notification</h4>
                <p>系统通知，发送给用户。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>fromUserId</code>: String - 发送通知的用户 ID。</li>
                    <li class="model-field"><code>toUserId</code>: String - 接收通知的用户 ID。</li>
                    <li class="model-field"><code>type</code>: String - 通知类型。</li>
                    <li class="model-field"><code>message</code>: String - 通知消息。</li>
                    <li class="model-field"><code>urlPath</code>: String? - 相关的 URL 路径。</li>
                    <li class="model-field"><code>isRead</code>: Boolean - 是否已读。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                </ul>
                <p class="relationship"><strong>索引：：</strong> (toUserId, isRead, createdTime)。</p>
            </div>

            <div class="model-section">
                <h4>AccessToken</h4>
                <p>API 访问令牌。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>name</code>: String - 令牌名称。</li>
                    <li class="model-field"><code>description</code>: String? - 令牌描述。</li>
                    <li class="model-field"><code>userId</code>: String - 所属用户 ID。</li>
                    <li class="model-field"><code>scopes</code>: String - 令牌作用域。</li>
                    <li class="model-field"><code>spaceIds</code>: String? - 允许访问的 Space ID 列表。</li>
                    <li class="model-field"><code>baseIds</code>: String? - 允许访问的 Base ID 列表。</li>
                    <li class="model-field"><code>sign</code>: String - 签名。</li>
                    <li class="model-field"><code>clientId</code>: String? - 客户端 ID。</li>
                    <li class="model-field"><code>hasFullAccess</code>: Boolean? - 是否具有完全访问权限。</li>
                    <li class="model-field"><code>expiredTime</code>: DateTime - 过期时间。</li>
                    <li class="model-field"><code>lastUsedTime</code>: DateTime? - 最后使用时间。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>lastModifiedTime</code>: DateTime? - 最后修改时间。</li>
                </ul>
            </div>

            <div class="model-section">
                <h4>Setting</h4>
                <p>系统级别的配置设置。</p>
                <ul>
                    <li class="model-field"><code>instanceId</code>: String @id - 实例 ID。</li>
                    <li class="model-field"><code>disallowSignUp</code>: Boolean? - 是否禁用注册。</li>
                    <li class="model-field"><code>disallowSpaceCreation</code>: Boolean? - 是否禁用空间创建。</li>
                    <li class="model-field"><code>disallowSpaceInvitation</code>: Boolean? - 是否禁用空间邀请。</li>
                    <li class="model-field"><code>enableEmailVerification</code>: Boolean? - 是否启用邮箱验证。</li>
                    <li class="model-field"><code>aiConfig</code>: String? - AI 配置。</li>
                    <li class="model-field"><code>brandName</code>: String? - 品牌名称。</li>
                    <li class="model-field"><code>brandLogo</code>: String? - 品牌 Logo。</li>
                </ul>
            </div>

            <div class="model-section">
                <h4>OAuthApp</h4>
                <p>OAuth 应用程序注册信息。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>name</code>: String - 应用名称。</li>
                    <li class="model-field"><code>logo</code>: String? - 应用 Logo URL。</li>
                    <li class="model-field"><code>homepage</code>: String - 应用主页。</li>
                    <li class="model-field"><code>description</code>: String? - 应用描述。</li>
                    <li class="model-field"><code>clientId</code>: String @unique - 客户端 ID。</li>
                    <li class="model-field"><code>redirectUris</code>: String? - 重定向 URI 列表。</li>
                    <li class="model-field"><code>scopes</code>: String? - 作用域。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>lastModifiedTime</code>: DateTime? - 最后修改时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                </ul>
            </div>

            <div class="model-section">
                <h4>OAuthAppAuthorized</h4>
                <p>用户授权的 OAuth 应用程序。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>clientId</code>: String - OAuthApp 的客户端 ID。</li>
                    <li class="model-field"><code>userId</code>: String - 授权用户 ID。</li>
                    <li class="model-field"><code>authorizedTime</code>: DateTime - 授权时间。</li>
                </ul>
                <p class="relationship"><strong>唯一索引：：</strong> (clientId, userId)。</p>
            </div>

            <div class="model-section">
                <h4>OAuthAppSecret</h4>
                <p>OAuth 应用程序的密钥。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>clientId</code>: String - OAuthApp 的客户端 ID。</li>
                    <li class="model-field"><code>secret</code>: String @unique - 密钥。</li>
                    <li class="model-field"><code>maskedSecret</code>: String - 掩码密钥。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                    <li class="model-field"><code>lastUsedTime</code>: DateTime? - 最后使用时间。</li>
                </ul>
            </div>

            <div class="model-section">
                <h4>OAuthAppToken</h4>
                <p>OAuth 应用程序的令牌（如刷新令牌）。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>appSecretId</code>: String - 所属 OAuthAppSecret 的 ID。</li>
                    <li class="model-field"><code>refreshTokenSign</code>: String @unique - 刷新令牌签名。</li>
                    <li class="model-field"><code>expiredTime</code>: DateTime - 过期时间。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                </ul>
            </div>

            <div class="model-section">
                <h4>RecordHistory</h4>
                <p>记录表数据的修改历史。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>tableId</code>: String - 所属 TableMeta 的 ID。</li>
                    <li class="model-field"><code>recordId</code>: String - 记录 ID。</li>
                    <li class="model-field"><code>fieldId</code>: String - 字段 ID。</li>
                    <li class="model-field"><code>before</code>: String - 修改前的值（JSON 字符串）。</li>
                    <li class="model-field"><code>after</code>: String - 修改后的值（JSON 字符串）。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                </ul>
                <p class="relationship"><strong>索引：：</strong> (tableId, recordId, createdTime) 和 (tableId, createdTime)。</p>
            </div>

            <div class="model-section">
                <h4>Trash</h4>
                <p>通用垃圾箱，用于软删除的资源。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>resourceType</code>: String - 资源类型。</li>
                    <li class="model-field"><code>resourceId</code>: String - 资源 ID。</li>
                    <li class="model-field"><code>parentId</code>: String? - 父资源 ID。</li>
                    <li class="model-field"><code>deletedTime</code>: DateTime - 删除时间。</li>
                    <li class="model-field"><code>deletedBy</code>: String - 删除者 ID。</li>
                </ul>
                <p class="relationship"><strong>唯一索引：：</strong> (resourceType, resourceId)。</p>
            </div>

            <div class="model-section">
                <h4>TableTrash</h4>
                <p>被删除的表的快照信息。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>tableId</code>: String - 被删除的 Table ID。</li>
                    <li class="model-field"><code>resourceType</code>: String - 资源类型。</li>
                    <li class="model-field"><code>snapshot</code>: String - 表的快照（JSON 字符串）。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                </ul>
            </div>

            <div class="model-section">
                <h4>RecordTrash</h4>
                <p>被删除的记录的快照信息。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>tableId</code>: String - 所属 TableMeta 的 ID。</li>
                    <li class="model-field"><code>recordId</code>: String - 被删除的记录 ID。</li>
                    <li class="model-field"><code>snapshot</code>: String - 记录的快照（JSON 字符串）。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                </ul>
            </div>

            <div class="model-section">
                <h4>Plugin</h4>
                <p>插件的元数据信息。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>name</code>: String - 插件名称。</li>
                    <li class="model-field"><code>description</code>: String? - 插件描述。</li>
                    <li class="model-field"><code>detailDesc</code>: String? - 详细描述。</li>
                    <li class="model-field"><code>logo</code>: String - Logo URL。</li>
                    <li class="model-field"><code>helpUrl</code>: String? - 帮助文档 URL。</li>
                    <li class="model-field"><code>status</code>: String - 插件状态。</li>
                    <li class="model-field"><code>positions</code>: String - 插件位置。</li>
                    <li class="model-field"><code>url</code>: String? - 插件 URL。</li>
                    <li class="model-field"><code>secret</code>: String @unique - 插件密钥。</li>
                    <li class="model-field"><code>maskedSecret</code>: String - 掩码密钥。</li>
                    <li class="model-field"><code>i18n</code>: String? - 国际化配置。</li>
                    <li class="model-field"><code>config</code>: String? - 插件配置。</li>
                    <li class="model-field"><code>pluginUser</code>: String? - 插件用户。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>lastModifiedTime</code>: DateTime? - 最后修改时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                    <li class="model-field"><code>lastModifiedBy</code>: String? - 最后修改者 ID。</li>
                </ul>
                <p class="relationship"><strong>关系：：</strong> 包含多个 PluginInstall (`pluginInstall PluginInstall[]`)。</p>
            </div>

            <div class="model-section">
                <h4>PluginInstall</h4>
                <p>插件的安装信息。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>pluginId</code>: String - 所属 Plugin 的 ID。</li>
                    <li class="model-field"><code>baseId</code>: String - 所属 Base 的 ID。</li>
                    <li class="model-field"><code>name</code>: String - 安装名称。</li>
                    <li class="model-field"><code>positionId</code>: String - 位置 ID。</li>
                    <li class="model-field"><code>position</code>: String - 位置。</li>
                    <li class="model-field"><code>storage</code>: String? - 存储。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                    <li class="model-field"><code>lastModifiedTime</code>: DateTime? - 最后修改时间。</li>
                    <li class="model-field"><code>lastModifiedBy</code>: String? - 最后修改者 ID。</li>
                </ul>
                <p class="relationship"><strong>关系：：</strong> 属于一个 Plugin (`plugin Plugin @relation(fields: [pluginId], references: [id], onDelete: Cascade)`)。</p>
            </div>

            <div class="model-section">
                <h4>Dashboard</h4>
                <p>仪表盘信息。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>name</code>: String - 仪表盘名称。</li>
                    <li class="model-field"><code>baseId</code>: String - 所属 Base 的 ID。</li>
                    <li class="model-field"><code>layout</code>: String? - 布局配置（JSON 字符串）。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>lastModifiedTime</code>: DateTime? - 最后修改时间。</li>
                    <li class="model-field"><code>lastModifiedBy</code>: String? - 最后修改者 ID。</li>
                </ul>
            </div>

            <div class="model-section">
                <h4>Comment</h4>
                <p>记录或字段的评论。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>tableId</code>: String - 所属 TableMeta 的 ID。</li>
                    <li class="model-field"><code>recordId</code>: String - 记录 ID。</li>
                    <li class="model-field"><code>quoteId</code>: String? - 引用的评论 ID。</li>
                    <li class="model-field"><code>content</code>: String? - 评论内容。</li>
                    <li class="model-field"><code>reaction</code>: String? - 表情反应。</li>
                    <li class="model-field"><code>deletedTime</code>: DateTime? - 删除时间。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                    <li class="model-field"><code>lastModifiedTime</code>: DateTime? - 最后修改时间。</li>
                </ul>
                <p class="relationship"><strong>索引：：</strong> (tableId, recordId)。</p>
            </div>

            <div class="model-section">
                <h4>CommentSubscription</h4>
                <p>评论订阅，用于跟踪评论更新。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>tableId</code>: String - 所属 TableMeta 的 ID。</li>
                    <li class="model-field"><code>recordId</code>: String - 记录 ID。</li>
                    <li class="model-field"><code>createdBy</code>: String - 订阅者 ID。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                </ul>
                <p class="relationship"><strong>唯一索引：：</strong> (tableId, recordId)。</p>
            </div>

            <div class="model-section">
                <h4>Integration</h4>
                <p>第三方集成配置。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>resourceId</code>: String @unique - 资源 ID。</li>
                    <li class="model-field"><code>config</code>: String - 配置内容（JSON 字符串）。</li>
                    <li class="model-field"><code>type</code>: String - 集成类型。</li>
                    <li class="model-field"><code>enable</code>: Boolean? - 是否启用。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>lastModifiedTime</code>: DateTime? - 最后修改时间。</li>
                </ul>
            </div>

            <div class="model-section">
                <h4>PluginPanel</h4>
                <p>插件面板配置。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>name</code>: String - 面板名称。</li>
                    <li class="model-field"><code>tableId</code>: String - 所属 TableMeta 的 ID。</li>
                    <li class="model-field"><code>layout</code>: String? - 布局配置（JSON 字符串）。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>lastModifiedTime</code>: DateTime? - 最后修改时间。</li>
                    <li class="model-field"><code>lastModifiedBy</code>: String? - 最后修改者 ID。</li>
                </ul>
                <p class="relationship"><strong>关系：：</strong> 属于一个 TableMeta (`table TableMeta @relation(fields: [tableId], references: [id], onDelete: Cascade)`)。</p>
            </div>

            <div class="model-section">
                <h4>PluginContextMenu</h4>
                <p>插件上下文菜单配置。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>tableId</code>: String - 所属 TableMeta 的 ID。</li>
                    <li class="model-field"><code>pluginInstallId</code>: String @unique - 插件安装 ID。</li>
                    <li class="model-field"><code>order</code>: Float - 排序。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                    <li class="model-field"><code>lastModifiedTime</code>: DateTime? - 最后修改时间。</li>
                    <li class="model-field"><code>lastModifiedBy</code>: String? - 最后修改者 ID。</li>
                </ul>
                <p class="relationship"><strong>关系：：</strong> 属于一个 TableMeta (`table TableMeta @relation(fields: [tableId], references: [id], onDelete: Cascade)`)。</p>
            </div>

            <div class="model-section">
                <h4>UserLastVisit</h4>
                <p>用户最近访问的资源记录。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>userId</code>: String - 用户 ID。</li>
                    <li class="model-field"><code>resourceType</code>: String - 资源类型。</li>
                    <li class="model-field"><code>resourceId</code>: String - 资源 ID。</li>
                    <li class="model-field"><code>parentResourceId</code>: String - 父资源 ID。</li>
                    <li class="model-field"><code>lastVisitTime</code>: DateTime - 最后访问时间。</li>
                </ul>
                <p class="relationship"><strong>唯一索引：：</strong> (userId, resourceType, resourceId)。</p>
                <p class="relationship"><strong>索引：：</strong> (userId, resourceType, parentResourceId) 和 (userId, resourceType)。</p>
            </div>

            <div class="model-section">
                <h4>Template</h4>
                <p>预定义的模板，用于快速创建 Base。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>baseId</code>: String? - 模板关联的 Base ID。</li>
                    <li class="model-field"><code>cover</code>: String? - 封面图片 URL。</li>
                    <li class="model-field"><code>name</code>: String? - 模板名称。</li>
                    <li class="model-field"><code>description</code>: String? - 模板描述。</li>
                    <li class="model-field"><code>markdownDescription</code>: String? - Markdown 格式的描述。</li>
                    <li class="model-field"><code>categoryId</code>: String? - 所属模板分类 ID。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                    <li class="model-field"><code>lastModifiedTime</code>: DateTime? - 最后修改时间。</li>
                    <li class="model-field"><code>lastModifiedBy</code>: String? - 最后修改者 ID。</li>
                    <li class="model-field"><code>isSystem</code>: Boolean? - 是否为系统模板。</li>
                    <li class="model-field"><code>isPublished</code>: Boolean? - 是否已发布。</li>
                    <li class="model-field"><code>snapshot</code>: String? - 模板快照（JSON 字符串）。</li>
                    <li class="model-field"><code>order</code>: Float - 排序。</li>
                    <li class="model-field"><code>usageCount</code>: Int - 使用次数。</li>
                </ul>
            </div>

            <div class="model-section">
                <h4>TemplateCategory</h4>
                <p>模板分类。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>name</code>: String @unique - 分类名称。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                    <li class="model-field"><code>lastModifiedTime</code>: DateTime? - 最后修改时间。</li>
                    <li class="model-field"><code>lastModifiedBy</code>: String? - 最后修改者 ID。</li>
                    <li class="model-field"><code>order</code>: Float - 排序。</li>
                </ul>
            </div>

            <div class="model-section">
                <h4>Task</h4>
                <p>后台任务信息。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>type</code>: String - 任务类型。</li>
                    <li class="model-field"><code>status</code>: String - 任务状态。</li>
                    <li class="model-field"><code>snapshot</code>: String? - 任务快照（JSON 字符串）。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>lastModifiedTime</code>: DateTime? - 最后修改时间。</li>
                    <li class="model-field"><code>createdBy</code>: String - 创建者 ID。</li>
                    <li class="model-field"><code>lastModifiedBy</code>: String? - 最后修改者 ID。</li>
                </ul>
                <p class="relationship"><strong>关系：：</strong> 包含多个 TaskRun (`runs TaskRun[]`)。</p>
                <p class="relationship"><strong>索引：：</strong> (type, status)。</p>
            </div>

            <div class="model-section">
                <h4>TaskRun</h4>
                <p>后台任务的运行记录。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>taskId</code>: String - 所属 Task 的 ID。</li>
                    <li class="model-field"><code>status</code>: String - 运行状态。</li>
                    <li class="model-field"><code>snapshot</code>: String - 运行快照（JSON 字符串）。</li>
                    <li class="model-field"><code>spent</code>: Int? - 耗时（秒）。</li>
                    <li class="model-field"><code>errorMsg</code>: String? - 错误消息。</li>
                    <li class="model-field"><code>startedTime</code>: DateTime? - 开始时间。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                    <li class="model-field"><code>lastModifiedTime</code>: DateTime? - 最后修改时间。</li>
                </ul>
                <p class="relationship"><strong>关系：：</strong> 属于一个 Task (`task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)`)。</p>
                <p class="relationship"><strong>索引：：</strong> (taskId, status)。</p>
            </div>

            <div class="model-section">
                <h4>TaskReference</h4>
                <p>任务内部的引用关系。</p>
                <ul>
                    <li class="model-field"><code>id</code>: String @id - 唯一标识符。</li>
                    <li class="model-field"><code>fromFieldId</code>: String - 源字段 ID。</li>
                    <li class="model-field"><code>toFieldId</code>: String - 目标字段 ID。</li>
                    <li class="model-field"><code>createdTime</code>: DateTime - 创建时间。</li>
                </ul>
                <p class="relationship"><strong>唯一索引：：</strong> (toFieldId, fromFieldId)。</p>
                <p class="relationship"><strong>索引：：</strong> (fromFieldId) 和 (toFieldId)。</p>
            </div>

            <h3>4.2. 主要关系概述</h3>
            <ul>
                <li><strong>Space to Base (1:M):</strong> 一个 <code>Space</code> 可以包含多个 <code>Base</code>。</li>
                <li><strong>Base to TableMeta (1:M):</strong> 一个 <code>Base</code> 可以包含多个 <code>TableMeta</code>。</li>
                <li><strong>TableMeta to Field (1:M):</strong> 一个 <code>TableMeta</code> 可以包含多个 <code>Field</code>。</li>
                <li><strong>TableMeta to View (1:M):</strong> 一个 <code>TableMeta</code> 可以包含多个 <code>View</code>。</li>
                <li><strong>User to Account (1:M):</strong> 一个 <code>User</code> 可以关联多个 <code>Account</code>（第三方登录）。</li>
                <li><strong>Plugin to PluginInstall (1:M):</strong> 一个 <code>Plugin</code> 可以被多次安装 (<code>PluginInstall</code>)。</li>
                <li><strong>Task to TaskRun (1:M):</strong> 一个 <code>Task</code> 可以有多个 <code>TaskRun</code> 记录。</li>
            </ul>
        </section>
    </div>
</body>
</html> 